/**
 * 处理图片文件
 *
 * @param {File} file - 要处理的图片文件对象
 */
async function processImageFile(file) {
	// 检查是否已连接视觉模型，若未连接则尝试连接
	if (!isVisualConnected && !visualEndpointConnection()) return showSystemMessage('月华无法查看这张图片', 'error');
	/** 保存图片到服务器并返回URL */
	const imageUrl = await saveImageToServer(file);
	/** 获取用户输入 */
	const userMessage = getUserMessage();
	// 渲染图片消息
	renderMessage(createMessageObject("user", userMessage, true, false, false, imageUrl), chatHistoryPanel);
	// 等待1000毫秒，确保图片渲染完成
	await new Promise(resolve => setTimeout(resolve, 1000));
	/** 获取视觉模型分析结果 */
	async function VisualHandleModel() { return requestVisualAnalysis(imageUrl, userMessage); };
	// 调用视觉分析模型
	await loadConversationFromAPI(chatHistoryPanel, '', VisualHandleModel);
};

/**
 * 处理ZIP文件
 *
 * @param {File} file - 要处理的ZIP文件对象
 */
async function processZipFile(file) {
	try {
		/** 创建一个FormData对象，用于存储要上传的文件数据 */
		const formData = new FormData();
		// 将ZIP文件添加到FormData对象中
		formData.append('zip_file', file);
		/** 发送PUT请求到 '/archive' 端点，上传ZIP文件 */
		const response = await fetch('/archive', { method: 'PUT', body: formData });
		// 检查响应状态是否正常，若不正常则显示错误消息并终止函数
		if (!response.ok) return showSystemMessage(`HTTP ${response.status}: ${response.statusText}`, 'error');
		/** 将响应数据解析为JSON格式 */
		const result = await response.json();
		// 检查是否解压出文件，若未解压出文件则显示提示消息并终止函数
		if (!result.extracted_files || result.extracted_files.length === 0) return showSystemMessage(`月华未能从 ${file.name} 中提取出任何文件 !!`, 'info');
		/**
		 * 处理单个解压出的文件
		 *
		 * @param {Object} fileInfo - 包含文件信息的对象
		 */
		function fileProcess(fileInfo) {
			try {
				/** 尝试将文件内容的字节数组转换为Uint8Array */
				const uint8Array = new Uint8Array(fileInfo.content);
				/** 创建一个UTF-8解码器 */
				const decoder = new TextDecoder('utf-8');
				/** 将Uint8Array解码为文本内容 */
				const fileContent = decoder.decode(uint8Array);
				/** 检查文件内容是否包含二进制数据（非文本文件） */
				const hasBinary = /[\x00-\x08\x0E-\x1F]/.test(fileContent);
				// 若不包含二进制数据，则导入文件内容
				if (!hasBinary) fileSliceImport(fileInfo.name, fileContent);
				// 若包含二进制数据，则跳过该文件并显示提示消息
				else showSystemMessage(`跳过二进制文件: ${fileInfo.name}`, 'success');
			}
			catch (error) {
				// 处理文件时发生错误，显示错误信息
				showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
			}
		}
		// 遍历所有解压出的文件，对每个文件调用fileProcess函数进行处理
		result.extracted_files.forEach(fileProcess);
		// 所有文件处理完成后，在聊天面板中显示ZIP文件处理完成的消息
		tracelessRenderMessage(`ZIP文件 ${file.name} 处理完成！`, chatHistoryPanel);
	}
	catch (error) {
		// 处理ZIP文件过程中发生错误，显示错误信息
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error")
	}
};

/**
 * 以文本格式读取文件内容
 *
 * @param {File} file - 需要读取的文件对象
 */
function readFileAsText(file) {
	/** 创建一个 FileReader 实例，用于读取文件内容 */
	const reader = new FileReader();
	// 当文件读取成功完成时，调用函数处理文件名和文件内容
	reader.onload = event => tryCaptureConfig(file.name, event.target.result);
	// 当文件读取过程中发生错误时，显示文件读取失败的错误提示信息
	reader.onerror = error => showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
	// 以文本格式读取指定的文件
	reader.readAsText(file);
};